package org.example.me.handler;

import lombok.extern.slf4j.Slf4j;
import org.example.me.enums.ExcelTypeEnum;
import org.example.me.handler.template.ExcelExport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * Excel导出工厂类
 * 用于根据Excel类型动态选择对应的导出处理器进行处理
 */
@Slf4j
@Component
public class ExcelExportFactory {

    /**
     * Excel导出类型与处理器的映射关系
     */
    private final Map<ExcelTypeEnum, ExcelExport> excelExportMap;

    /**
     * 构造函数，通过Spring自动注入所有实现了ExcelExport接口的处理器实例
     * @param excelExport 所有ExcelExport接口的实现类实例列表
     */
    @Autowired(required = false)
    public ExcelExportFactory(List<ExcelExport> excelExport) {
        if (excelExport != null) {
            excelExportMap = excelExport.stream()
                    .collect(Collectors.toMap(ExcelExport::getExcelType, Function.identity()));
        } else {
            excelExportMap = Collections.emptyMap();
        }
    }

    /**
     * 根据Excel类型获取对应的导出处理器
     * @param type Excel类型枚举值
     * @return 对应的Excel导出处理器，未找到返回null
     */
    public ExcelExport getExporter(ExcelTypeEnum type) {
        return excelExportMap.get(type);
    }

    /**
     * 检查是否支持指定类型的Excel导出
     * @param type Excel类型枚举值
     * @return 是否支持该类型
     */
    public boolean supports(ExcelTypeEnum type) {
        return excelExportMap.containsKey(type);
    }
}